package com.lanou3g.code0514.upload;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;

/**
 * Created by dllo on 18/5/14.
 */

/*文件上传的理解:
---------Web......乱码
http头信息,包含各个文件的文件名
空行
文件1
文件2
---------Web......乱码

上传时,会解析成一个一个的FileItem(里面含有文件名与二进制),然后再通过write方法
写到你创建的有名字的文件夹壳子里(名和壳子都是由你自己创建的)
*/
@WebServlet(name = "UploadServlet", urlPatterns = "/upload")
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        InputStream is = request.getInputStream();
//        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
//        String line = "";
//        while ((line = reader.readLine()) != null) {
//            System.out.println(line);
//        }
//        reader.close();

        //0.修改编码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //1.检测表单是否支持上传文件(检测有没有enctype="multipart/form-data",有就支持,没有就不支持)
        if (!ServletFileUpload.isMultipartContent(request)) {
            //如果不支持上传文件,就不用往下执行了
            return;
        }
        //2.创建ServletFileUpload对象,来上传文件
        FileItemFactory factory = new DiskFileItemFactory();//factory用来创建文件项,FileItemFactory用来创建表单中的FileItem对象
        ServletFileUpload upload = new ServletFileUpload(factory);
        //3.配置一些参数
        //3.1服务器支持上传的最大文件(30M)
        upload.setFileSizeMax(1024 * 1024 * 30);
        //3.2支持的带表单中其他数据,带文件,即整个表单的最大容量
        //40M
        upload.setSizeMax(1024 * 1024 * 40);
        //3.3支持中文
        upload.setHeaderEncoding("utf-8");
        //4.需要知道路径上传的文件要放在哪---文件夹
        //web文件夹的路径
        String path = getServletContext().getRealPath("") + File.separator + "upload";//在真实路径里创建
        // 一个upload的文件夹aaa.png就放在这里(web文件夹下的路径)
        File uploadDir = new File(path);//在这个路径下建立一个流
        if (!uploadDir.exists()) {
            //如果文件夹不存在,则创建文件夹
            uploadDir.mkdirs();
        }
        //5.真正的上传
        try {
            List<FileItem> fileItems = upload.parseRequest(request);
            if (fileItems != null && fileItems.size() > 0) {//判断这个数组为不为空,fileItems != null是判断有没有这个[],
                //fileItems.size() > 0是判断这个[]里有没有东西
                //有上传的内容
                for (FileItem fileItem : fileItems) {
                    if (fileItem.isFormField()) {//判断这个fileItem里的是不是只含有input里的东西,还是有你上传的东西
                        //如果是一个普通表单属性
                        //就别上传了,没东西
                        continue;
                    }
                    //本质上:这个文件名绝对不能用用户上传的文件名
                    String fileName = fileItem.getName();
                    String filePath = path + File.separator + fileName;//在已经建好的文件夹upload中创建aaa.png
                    File file = new File(filePath);
                    System.out.println(filePath);
                    //将上传来的文件写入我们自己的文件中
                    fileItem.write(file);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
